package visiopuce.service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import visiopuce.ApplicationContexte;
import visiopuce.HibernateUtil;
import visiopuce.DAO.DroitDAO;
import visiopuce.DAO.DroitDAOImpl;
import visiopuce.DAO.HistoriqueDAOImpl;
import visiopuce.objets.Droit;
import visiopuce.objets.Historique;
import visiopuce.objets.Utilisateur;

public class DroitServiceImpl implements DroitService {

	private static final Log log = LogFactory.getLog(DroitService.class);

	private DroitDAO droitDAO = DroitDAOImpl.getInstance();

	/** Constructeur priv� */
	private DroitServiceImpl() {
	}

	/** Instance unique non pr�initialis�e */
	private static DroitServiceImpl INSTANCE = null;

	/** Point d'acc�s pour l'instance unique du singleton */
	public static DroitService getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new DroitServiceImpl();
		}
		return INSTANCE;
	}

	public boolean peutModifierByUtilisateurAndChamp(Utilisateur utilisateur, String champ) {
		boolean peut = false;
		HibernateUtil.beginTransaction();
		String crud = droitDAO.getCrudByUtilisateurAndChamp(utilisateur, champ);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		if (crud != null) {
			peut = crud.contains("u");
		}
		return peut;
	}

	public boolean peutCreerByUtilisateurAndChamp(Utilisateur utilisateur, String champ) {
		boolean peut = false;
		HibernateUtil.beginTransaction();
		String crud = droitDAO.getCrudByUtilisateurAndChamp(utilisateur, champ);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		if (crud != null) {
			peut = crud.contains("c");
		}
		return peut;
	}

	@Override
	public boolean peutSupprimerByUtilisateurAndChamp(Utilisateur utilisateur, String champ) {
		boolean peut = false;
		HibernateUtil.beginTransaction();
		String crud = droitDAO.getCrudByUtilisateurAndChamp(utilisateur, champ);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		if (crud != null) {
			peut = crud.contains("d");
		}
		return peut;
	}

	@Override
	public boolean peutLireByUtilisateurAndChamp(Utilisateur utilisateur, String champ) {
		boolean peut = false;
		HibernateUtil.beginTransaction();
		String crud = droitDAO.getCrudByUtilisateurAndChamp(utilisateur, champ);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		if (crud != null) {
			peut = crud.contains("r");
		}
		return peut;
	}

	@Override
	public Droit getDroitByUtilisateurAndChamp(Utilisateur utilisateur, String champ) {
		HibernateUtil.beginTransaction();
		Droit droit = droitDAO.getDroitByUtilisateurAndChamp(utilisateur, champ);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return droit;
	}

	@Override
	public void save(Droit droit) {
		HibernateUtil.beginTransaction();
		try {
			droitDAO.save(droit);
			Historique h2 = new Historique();
			h2.setDate(new Date());
			h2.setRequete("Enregistrement " + droit.toString());
			h2.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
			HistoriqueDAOImpl.getInstance().save(h2);
			HibernateUtil.commitTransaction();
		} catch (Exception ex) {
			ex.printStackTrace();
			HibernateUtil.rollbackTransaction();
		} finally {
			HibernateUtil.closeSession();
		}
	}

	@Override
	public void saveCrud(String crud, String nom, String champ) {
		Utilisateur user = UtilisateurServiceImpl.getInstance().getUtilisateurByNom(nom.split(" ")[0]);
		HibernateUtil.beginTransaction();
		Droit droit = droitDAO.getDroitByUtilisateurAndChamp(user, champ);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		if (droit == null) {
			droit = new Droit();
			droit.setIdDroit(0);
			droit.setUtilisateur(user);
			droit.setChamp(champ);
		}
		droit.setCrud(crud);
		save(droit);
	}

}